protected vs private vs public
Protected provides controlled visibility between private implementation details and a completely public API. It generally allows access from the declaring class and derived classes, but the exact rules differ between Java and C#. Private is more restrictive and is intended for implementation details of the declaring type. Public exposes the member as part of the externally accessible API. In Java, protected also has package-level access semantics, which makes it broader than simply 'subclasses only'.
private: strongest normal member-level encapsulation.
protected: exposes a member to the declaring type and appropriate subclasses.
public: exposes the member broadly according to the language's accessibility model.
Java protected additionally provides access within the same package.
Protected members can increase coupling between a base class and subclasses.